#include "ljson_type.h"
#include "ljsonc_create.h"
#include "ljsonc_parse.h"
#include "ljsonc_find.h"

typedef char *ljsonc_key;
typedef char *CString;
typedef struct ljsonc_value ljsonc_value;
typedef struct ljsonc_element ljsonc_element;
typedef struct ljsonc_json ljsonc_json;
typedef struct ljsonc_array ljsonc_array;

#ifdef __cplusplus
extern "C" {
#endif

ljsonc_value *create_value();
ljsonc_element *create_element();
ljsonc_element *create_element_v(const char *kry, ljsonc_value *value);
ljsonc_json *create_json();
ljsonc_array *create_array();
CString create_string(const char *c_str);

ljsonc_value *clone_value(ljsonc_value *value);
ljsonc_element *clone_element(ljsonc_element *elem);
ljsonc_json *clone_json(ljsonc_json *json);
ljsonc_array *clone_array(ljsonc_array *array);
CString clone_string(const char *c_str);

ljsonc_value *create_value_int(int n);
ljsonc_value *create_value_double(double dn);
ljsonc_value *create_value_string(const char *c_str);
ljsonc_value *create_value_json(ljsonc_json *json);
ljsonc_value *create_value_array(ljsonc_array *array);

void destory_value(ljsonc_value *value);
void destory_element(ljsonc_element *elem);
void destory_json(ljsonc_json *json);
void destory_array(ljsonc_array *array);
void destory_string(CString str);

void set_value_int(ljsonc_value *value, int n);
void set_value_double(ljsonc_value *value, double dn);
void set_value_string(ljsonc_value *value, const char *c_str);
void set_value_json(ljsonc_value *value, ljsonc_json *json);
void set_value_array(ljsonc_value *value, ljsonc_array *array);

void set_element_key(ljsonc_element *elem, const char *c_str);
void set_element_value(ljsonc_element *elem, ljsonc_value *value);
void set_element(ljsonc_element *elem, const char *c_str, ljsonc_value *value);

void set_element_int(ljsonc_element *value, int n);
void set_element_double(ljsonc_element *value, double dn);
void set_element_string(ljsonc_element *value, const char *c_str);
void set_element_json(ljsonc_element *value, ljsonc_json *json);
void set_element_array(ljsonc_element *value, ljsonc_array *array);

bool json_append(ljsonc_json *json, ljsonc_element *elem);
bool array_append(ljsonc_array *array, ljsonc_value *value);

CString get_json_value(ljsonc_json *json);
bool save_json(FILE *fp, ljsonc_json *json);

ljsonc_json *parse_from_string(const char *c_str);
ljsonc_json *parse_from_file(const char* filename);

ljsonc_element **get_elements(const ljsonc_json *json);
ljsonc_element *find_element(const ljsonc_json *json, const char *key);
ljsonc_element *find_next_element(const ljsonc_json *json, const ljsonc_element *elem);
bool get_element_value(const ljsonc_element *elem, char mod, void *ret_value);

ljsonc_value **get_array_values(const ljsonc_array *array);
ljsonc_value *get_array_value(const ljsonc_array *array, unsigned int index);
bool get_value(const ljsonc_value *value, char mod, void *ret_value);

#ifdef __cplusplus
}
#endif